#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: Andevilin
# 功能：迷宫游戏的主程序，实现游戏的主窗口绘制与按键处理等功能
# from cProfile import label
from operator import truediv

# 窗口的大小
# WINDWS_SIZE = '800x600'
WELCOME_WINDOW_SIZE = '400x190'

# 按钮的大小
BUTTON_WIDTH = 11
BUTTON_HEIGHT = 1

# 窗口初始化位置
WINDOW_INITIALIZATION_POSZITION = '+700+300'

CLOSE_FLAG = False

# 初始化迷宫的大小
# 默认十个格子的宽度与高度
x = 10
y = 10


from  tkinter import *
from tkinter import messagebox
import tkinter
import game
import graphics

class Application(tkinter.Frame):
    def __init__(self, master=None):
        # 调用父类的初始化方法
        tkinter.Frame.__init__(self, master)
        # 初始化done变量
        self.done = None
        # 初始化x变量,x代表迷宫的格子的宽度数量
        self.x = x
        # 初始化y变量，y代表迷宫的格子的高度数量
        self.y = y
        # 调用grid方法
        self.grid()
        # 调用createWidgets方法，创建游戏界面
        self.field = self.createWidgets(x, y)
        # 初始化游戏对象
        self.game = game.Game(self.field, self.x - 2, self.y - 2)
        # 调用playGame方法，开始游戏
        self.playGame()

    # 解决窗口关闭报错的问题
    def protocol(self, param, closeWindow):
        pass

    # 响应再来一次按钮事件
    def playGame(self):
        # 开始游戏
        self.initGame()
        self.addHandlers(self.field)

    # 初始化游戏
    def initGame(self):
        self.game.cleraGame()
        self.game.drawGame()
        # print("test")

    # 实现按键处理
    def addHandlers(self, field):
       # 绑定任意按键事件
        seq = '<Any-KeyPress>'
        # 将按键事件绑定到handleKey函数上
        field.bind_all(sequence=seq, func=self.handleKey, add=None)

    # 处理按键事件
    def handleKey(self, event):
        # 如果条件为False，则打印出event.keysym, event.keycode, event.keysym_num
        if False:
            print("handleKey:" , event.keysym, event.keycode, event.keysym_num)
        # 初始化mv为None
        mv = None
        # print(event.keycode)
        # 如果event.keycode等于101，则mv赋值为'D'  101 为数字键 5
        if event.keycode == 101:
            mv = 'D'
        # 如果event.keycode等于100，则mv赋值为'L'  100 为数字键 4
        elif event.keycode == 100:
            mv = 'L'
        # 如果event.keycode等于102，则mv赋值为'R'  102 为数字键 6
        elif event.keycode == 102:
            mv = 'R'
        # 如果event.keycode等于104，则mv赋值为'U'  104 为数字键 8
        elif event.keycode == 104:
            mv = 'U'
        # 如果event.keycode等于83，则mv赋值为'D'  83 为 S键
        elif event.keycode == 83:
            mv = 'D'
        # 如果event.keycode等于87，则mv赋值为'U'  87 为 W键
        elif event.keycode == 87:
            mv = 'U'
        # 如果event.keycode等于65，则mv赋值为'L'  65 为 A键
        elif event.keycode == 65:
            mv = 'L'
        # 如果event.keycode等于68，则mv赋值为'R'  68 为 D键
        elif event.keycode == 68:
            mv = 'R'
        # 如果event.keysym等于"Down"，则mv赋值为'D'  Down 为方向键 ↓
        elif event.keysym == "Down":
            mv = 'D'
        # 如果event.keysym等于"Up"，则mv赋值为'U'    Up 为方向键 ↑
        elif event.keysym == "Up":
            mv = 'U'
        # 如果event.keysym等于"Left"，则mv赋值为'L'   Left 为方向键 ←
        elif event.keysym == "Left":
            mv = 'L'
        # 如果event.keysym等于"Right"，则mv赋值为'R'   Right 为方向键 →
        elif event.keysym == "Right":
            mv = 'R'
        # 如果以上条件都不满足，则返回
        else:
            return

        # 如果self.game.move(mv)返回True，则调用self.stopGame()
        if self.game.move(mv):
            self.stopGame()

    # 处理点击答案按钮事件
    def answer(self):
        self.game.auto(x,y)
        # app.after(50,self.answer)
        # self.stopGame()

    # 处理点击帮助按钮事件
    def help(self):
        messagebox.showinfo("游戏规则", "1.蓝色的点是入口，红色的点是出口。\n"
                                        "2.玩家可以通过键盘上的方向键来控制蓝色小点的上下左右移动。\n"
                                        "3.玩家需要找到一条从蓝色点到红色点的路径。\n"
                                        "4.游戏开始，玩家只有30秒的时间找到出口，否则游戏将结束。\n"
                                        "5.玩家可以通过看答案按钮来查看答案。")


    # 处理开始按钮点击事件
    def start(self):
        messagebox.showinfo("温馨提示","您将有30秒的时间来完成游戏，祝您好远！")

    # 创建图形化界面
    def createWidgets(self, x, y):
        # 设置迷宫的宽和高
        w = y * graphics.CELL_WIDTH
        h = x * graphics.CELL_HEIGHT

        # 创建一个画布,白色背景
        field = tkinter.Canvas(self, width = w,height= h, bg=graphics.BGC,offset="500,500")
        field.grid()

        # self.textLabel = tkinter.Label(self, text=" ")
        # self.textLabel.pack()

        # 添加开始游戏、再来一次、退出游戏、看答案、帮助等功能按钮
        fm = Frame(height=30, width=210)
        fm1 = Frame(fm, height=30, width=60)
        fm2 = Frame(fm, height=30, width=60)
        fm3 = Frame(fm, height=30, width=60)
        fm4 = Frame(fm, height=30, width=60)
        fm5 = Frame(fm, height=30, width=60)
        fm.grid(row=1)
        fm1.pack(side='left')
        fm2.pack(side='left')
        fm3.pack(side='left')
        fm4.pack(side='left')
        fm5.pack(side='right')
        Button(fm3, text="看答案", width=10, command=self.answer).pack(side='left')
        Button(fm1, text="开始游戏", width=10, command=self.start).pack(side='left')
        Button(fm2, text="再来一次", width=10, command=self.playGame).pack(side='left')
        Button(fm4, text="帮助", width=10, command=self.help).pack(side='left')
        Button(fm5, text="退出游戏", width=10, command=self.stopGame).pack(side='right')

        return field

    # 游戏结束
    def stopGame(self):
        self.done = True
        # app.destroy()
        self.quit()



def test(content):
    if content.isdigit() or (content == ''):
        return True
    else:
        return False

def generateMaze():
    # 生成一个迷宫的方法
    global CLOSE_FLAG
    CLOSE_FLAG= False

    # 定义两个全局变量，表示迷宫的大小,默认为10
    global x, y

    # 如果宽度输入框为空或者高度输入框为空
    if width_entry.get() == '' or height_entry.get() == '':
        # 将迷宫宽度设置为默认迷宫宽度加2
        x = 12
        # 将迷宫高度设置为默认迷宫高度加2
        y = 12
    else:
        # 获取迷宫的宽度，并将其加2
        x = int(width_entry.get()) + 2
        # 获取迷宫的高度，并将其加2
        y = int(height_entry.get()) + 2
    # 关闭窗口
    window.destroy()
    CLOSE_FLAG = True


def closeWindow():
    return





def main():
    pass

if __name__ == '__main__':
    # 创建一个欢迎加设置界面迷宫大小的窗口
    window = tkinter.Tk()
    # 设置窗口标题为"迷宫游戏"
    window.title("迷宫游戏")
    # 设置窗口大小
    window.geometry(WELCOME_WINDOW_SIZE)
    # 设置窗口位置
    window.geometry(WINDOW_INITIALIZATION_POSZITION)

    # 创建2个StringVar对象，用于存储字符串变量
    string_v1 = tkinter.StringVar()
    string_v2 = tkinter.StringVar()
    string_v1.set('10')
    string_v2.set('10')

    # 创建一个函数，用于验证输入的迷宫大小是否合法
    testCMD = window.register(test)

    # 创建一个空白的标签
    tkinter.Label(text='').pack()

    # 创建一个标签，用于显示设置迷宫宽度的提示信息
    width_label = tkinter.Label(text="设置迷宫的高度：",width=45, anchor='w')
    # 将标签添加到窗口中
    width_label.pack()

    # 创建一个输入框，用于输入迷宫的宽度
    width_entry = tkinter.Entry(window, show=None, textvariable=string_v1,
                                validate='key', validatecommand=(testCMD, '%P'))
    # 将输入框添加到窗口中
    width_entry.pack()

    # 创建一个标签，用于显示设置迷宫宽度的提示信息
    height_label = tkinter.Label(text="设置迷宫的宽度：",width=45, anchor='w')
    # 将标签添加到窗口中
    height_label.pack()

    # 创建一个输入框，用于输入迷宫的宽度
    height_entry = tkinter.Entry(window, show=None, textvariable=string_v2,
                                 validate='key', validatecommand=(testCMD, '%P'))
    # 将输入框添加到窗口中
    height_entry.pack()

    # 创建一个空白的标签
    tkinter.Label(text='').pack()
    #tkinter.Label(text='测试',width=100,anchor='w').pack()
    # 创建一个按钮，用于开始游戏
    start_button = tkinter.Button(window, text="开始游戏", width=BUTTON_WIDTH, height=BUTTON_HEIGHT,
                                  command=generateMaze).pack()


    # 进入主循环
    window.mainloop()

    if CLOSE_FLAG:
        # 创建一个迷宫游戏的主窗口
        app = Application()
        # 设置窗口标题为"迷宫游戏"
        app.master.title("迷宫游戏")
        app.protocol('WM_DELETE_WINDOW', closeWindow)

        # 进入迷宫游戏的主循环
        app.mainloop()
